#include "Servidor.h"
#include "Cola.h"
#include "Conductor.h"

Define_Module(Cola);


Cola::Cola(){
}

Cola::~Cola(){
}

void Cola::initialize(){
	longAux = 0;
	lq = 0;
	colaConductores.setName("Cola conductores");
}

void Cola::handleMessage(cMessage *msg){
	Conductor *persona = dynamic_cast<Conductor*> (msg);
	if(servidoresDisponibles()>0){
		persona->setLlegadaCola(0);
		persona->setAtendido(false);
		send(persona,"salida");
	}
	else{
		t1 = simTime();
		d = false;
		persona->setLlegadaCola(t1);
    	colaConductores.insert(persona);
	}
}

/*
 *Utilizado por Servidor que haya terminado con
 *la atencion de un conductor. Tambien se calcula
 *parcialmente Lq.
 */
void Cola::siguienteTurno(){
	Enter_Method("siguienteTurno()");
	t2 = simTime();
    if (colaConductores.length() != 0){
    	longAux =  longAux + ((t2.dbl()-t1.dbl()) * (colaConductores.length()));
   		t1 = simTime();
    	Conductor *persona = (Conductor*) colaConductores.pop();
    	persona->setSalidaCola(t2);
		persona->setAtendido(false);
		send(persona,"salida");
    }
}


/*
 * Retorna la cantidad de servidores que estan disponibles
 */
int Cola::servidoresDisponibles(){
	cGate *cg = this->gate(findGate("salida"))->getNextGate();
	cModule *cm = cg->getOwnerModule();
	Servidor *s = dynamic_cast<Servidor *> (cm);
	return s->sDisp();
}



/*
 * Cuando termina la simulacion muestra por pantalla el valor de Lq
 * para examenMedico y examenPractico
 */
void Cola::finish(){

	if((strcmp(this->getParentModule()->getName(),"examenPractico")==0)||(strcmp(this->getParentModule()->getName(),"examenMedico")==0)){
		lq = longAux/simTime();
		ev << "Longitud promedio de cola =  "<< lq <<"; del sistema " << this->getParentModule()->getName()<<"\n";
	}
}

